//整个项目的入口
//先初始化项目 添加包管理文件  npm init -y
//安装express
const express = require('express')
const app = express() 
const joi = require('joi')
const config = require('./config')
//解决跨域问题 安装cors模块 注册cors中间件
const cors = require('cors');
app.use(cors());
//注册解析表单数据的中间件
app.use(express.urlencoded({extended:false}))
//挂载静态资源
app.use('/uploads',express.static('./uploads'))
//因为我们频繁的对错误要进行处理 所以我们注册一个中间件专门用来处理错误
app.use(function(req,res,next){
    //我们默认把状态设置为1
    res.cc = (err,status = 1)=>{
        res.send({
        status,
        //如果是错误对象那么返回 错误对象中的信息 
        message: err instanceof Error? err.message:err
        })
    }
    next();
    })
//我们要对除了/api下的接口进行token验证  所以我们 我们要使用express-jwt中间件对其进行解析
const expressJWT = require('express-jwt');
// 注册token解析中间件
app.use(expressJWT({secret:config.jwtSecretKey}).unless({path:[/^\/api/]}))


//下面分两个模块一个路由模块 一个路由处理函数模块 便于我们后期的一个维护 在根目录创建router和router_handler
//这两个文件夹
//导入路由模块并注册路由
const userRouter = require('./router/user');
app.use('/api',userRouter);
//导入用户信息模块并注册路由
const userinfoRouter = require('./router/userinfo');
//注册路由
app.use('/my',userinfoRouter);
//导入获取文章的路由模块
const artCateRouter = require('./router/artcate')
app.use('/my/article',artCateRouter)
//添加文章的路由模块 多思考不要乱删
const articleRouter = require('./router/article');
//注册路由
app.use('/my/article',articleRouter)
//表单中间件验证失败的错误捕获
app.use(function(err,req,res,next){
    if(err instanceof joi.ValidationError) return res.cc(err);
    // console.log(err)
    //身份验证失败  也就是请求头没token时 会发生下面的错误
    if(err.name === 'UnauthorizedError') return res.cc("身份验证失败")
    //未知错误
    res.cc(err)
})
//启动服务器
app.listen(3007,(req,res)=>{
    console.log('api running at http://127.0.0.1:3007');
})